/* 
 * File:   SingleCommand.cpp
 * Author: weeteck
 * 
 * Created on 12. listopad 2012, 12:42
 */

#include "SingleCommand.h"

using std::string;
using std::list;
using std::cout;
using std::endl;


/**
 * Statická metoda uvolněje paměť po poli argumentů (v podobě C-string), které
 * vytváří funkce getArgsToArray().
 * 
 * @param args ukazatel na pole řetězců
 * @param nargs počet řetězců
 */
void
SingleCommand::destroyArgsArray(char** args, int nargs)
{
	if (args == NULL)
		return;

	for (int i = 0; i < nargs; i++)
	{
		if (args[i] != NULL)
			delete[] (args[i]);
	}

	delete[] args;
}

/**
 * Z členského seznamu args, který uchovává argumenty z příkazové řádky
 * (včetně názvu příkazu), vytvoří pole C-řetězců.
 * 
 * @param stringCount odkaz do kterého uloží počet argumentů
 * @return pole argumentů (včetně názvu příkazu)
 */
char**
SingleCommand::getArgsToArray(int & stringCount)
{
	stringCount = args.size();
	char** argv = new char*[stringCount + 1];

	int i = 0;
	for (list<string>::iterator str = args.begin();
					str != args.end(); ++str)
	{
		int strLength = strlen(str->c_str());

		char* newString = new char[strLength + 1];
		strcpy(newString, str->c_str());
		newString[strLength] = '\0';

		argv[i++] = newString;
	}

	argv[stringCount] = NULL;
	return argv;
}

/**
 * Z členského seznamu args, který uchovává argumenty z příkazové řádky
 * (včetně názvu příkazu), vytvoří jeden řetězec.
 * 
 * @return řetězec argumentů (včetně názvu příkazu)
 */
string
SingleCommand::getArgsToString()
{
	string cmd;
	for (list<string>::const_iterator it = args.begin(); it != args.end(); it++)
		cmd += (*it) + " ";
	cmd.erase(--cmd.end());
	return cmd;
}

/**
 * Metoda provede kontrolní výpis všech členských proměnných.
 */
void
SingleCommand::printAll()
{
	for (list<string>::const_iterator it = args.begin(); it != args.end(); it++)
		cout << *it << " ";
	cout << endl;

	cout << "backgrnd: " << inBackground << endl;

	cout << "fileIn: " << fileIn << " app: " << endl;
	cout << "fileOut: " << fileOut << " app: " << fileOutAppend << endl;
	cout << "fileErr: " << fileErr << " app: " << fileErrAppend << endl;
}

